# 1.模块的概念
# 在 Python 中，一个代码文件（也就是一个.py文件），我们也叫它一个模块（Module）


# 2.模块之间的调用
# 例1：
# 几个同事午餐经常一起去饭店聚餐，我们开发一个程序，记录每人的账单，月末可以结算
# 我们可以把 输入总费用和聚餐人员，计算人均费用 的功能，单独实现在一个模块文件 aa.py.

# 但是我们还需要将每次账单 记录到文件中，这样才好定期结算。
# 我们可以创建另外的一个模块文件 save.py。 在里面定义一个函数, 该函数实现记录消费信息到文件功能。

# 现在我们要在 aa 模块里面使用 save 模块里面的函数 savetofile。

# 2.1.方法一
# 在 aa.py 里面 通过 import 关键字导入模块 save。
# 这样 save 就成了模块 aa 里面的的一个变量，这个变量指向的是一个 模块对象
# 不要感到奇怪，在 Python 中， 模块 也是一个对象。
# 这样我们就可以通过 save.savetofile 访问到 save 模块里面的函数


# 2.2.方法二
# 还可以在 aa.py 里面 通过 from import 关键字导入其它模块里面的标识符（包括变量名和函数名等）。
# 导入之后，这些其它模块的变量名和函数名就成为 模块aa 里面 变量名，函数名了。
# 这样，我们就可以直接使用它们了。
# 完整代码如下：
# # 从 save 模块 导入标识符  savetofile ，
# # 导入后 savetofile 就成为模块aa中的一个变量，对应一个函数对象
# from save import savetofile
# fee = input('请输入午餐费用：')
# members = input('请输入聚餐人姓名，以英文逗号,分隔：')
# # 将人员放入一个列表
# memberlist = members.split(',')
# # 得到人数
# headcount = len(memberlist)
# # 计算人均费用
# avgfee = fee / headcount
# print(avgfee)
# # 直接使用 savetofile 函数
# savetofile(memberlist, avgfee)


# 2.3.一些技巧
# 如果在一个模块文件中需要导多个其它模块，可以分开写导入语句，像这样
#
# import aa
# import bb
# import cc
# 也可以一起导入，模块之间用逗号隔开，像这样
#
# import aa, bb, cc
# 如果我们要从1个模块里导入多个标识符，可以这样
#
# from aa import func1,var1,func2,var2
# 如果我们要导入1个模块里面的很多个标识符，可以使用*代表所有可导入的标识符（包括变量名，函数名等）
#
# from aa import *
# 这里 import * 把aa模块所有可以导入的对象全部都导入了。


# 如果我们需要从两个模块导入函数，恰好这两个函数是同名的，这是我们可以给其中一个起个别名，避免冲突，比如
# from save import savetofile
# from save2 import savetofile as savetofile2


# 2.4.注意点
# 当一个b模块从a模块导入了名字 var1 后，注意，b模块和a模块 是 各自有一个 名为 var1 的变量 ， 而不是两个模块共享一个 名为 var1 的变量。
# 如果要在多个模块中共享同一个数据对象，并且这个数据对象的值将来可能会改变。
# 即使共享的只是一个数字或者字符串变量， 也应该放在一个值可以变动的对象类型中。 比如：列表， 或者后面要学习的 字典 和 自定义类型。


# 2.5.将模块放入包中
# 当我们的项目模块文件特别多的时候，我们还需要将这些模块文件根据功能划分到不同的目录中。
# 这些放模块文件的目录，Python中把他们称之为 包 (Package) 。

# 在 Python 3.3 以前的版本，包目录里面需要有一个名字为 __init__.py 的初始化文件，有了它，Python才认为这是一个Python包。
# 通常，这个初始化文件里面不需要什么代码，一个空文件就可以了。
# 当然你也可以在里面加入代码，当这个包里面的模块被导入的时候，这些代码就会执行。

# Python 3.3 以后版本的解释器， 如果目录只是用来存放模块文件，就不需要一个空的 __init__.py 了。
# 但是 __init__.py 可以作为包的初始化文件，里面放入一些初始化代码，有独特的作用。

# 导入包中的函数：
from python基础.asset import stock

# 注意导入的是 stock.food.beef，调用的时候一定要加上所有的包路径前缀
stock.food.beef.stockleft()
# 或
from python基础.asset.stock.food.beef import stockleft
stockleft()


# 2.6.库的概念
# 如果你写的 模块文件 里面的函数， 实现了通用的功能，经常被其它模块所调用， 我们就可以把这些被调用的模块文件称之为 库
# 库是个抽象的概念，只要 某个模块 或者 一组模块 ， 开发它们的目的 就是给 其它模块调用的，就可以称之为库。

# 2.6.1.Python标准库
# 提供 内置类型 和 内置函数。无须使用 import 导入，可以直接使用。
# 还有些标准库，需要使用 import 导入，才能使用。
# 常见有 sys, os, time, datetime, json，random 等。
import sys
sys.exit(0)

# 获取字符串形式的当前日期和时间，可以使用datetime库
import datetime
# 返回这样的格式 '20160423'
datetime.date.today().strftime("%Y%m%d")
# 返回这样的格式 '20160423 19:37:36'
datetime.datetime.now().strftime("%Y%m%d %H:%M:%S")

# 我们要获取随机数字，可以使用random库
from random import randint
# 在 数字 1 到 8 之间(包括1和8本身)，随机取出一个数字
num = randint(1, 8)
print(num)

# 2.7.解释器怎么寻找模块文件？
# 当Python解释器执行
# import xxx
# 或者
# from xxx import  yyy
# 这样的语句时， Python 解释器是到什么地方查找模块文件xxx的？

# 它首先在解释器 内置模块 （ builtin modules ） 中寻找 是否有 xxx。
# 所谓内置模块，就是内置在Python解释器程序中的模块，它们是用C语言编写，编译链接在解释器里面。
# 也就是说它们就是解释器的一部分，所以解释器运行时，它们就在解释器里面，无需查找。
# 比如：time, sys, gc, math, mmap等，就是内置模块

# 内置模块
# sys.path
# 安装其他的库
# 课后练习